#include <sched.h>
#include <current.h>
/*
 * 这实在是折腾人的事情。
 */
#define _BLOCKSIG

long user_stack[PAGE_SIZE>>2];
struct 
{
	long *addr;
	short b;
} stack_start={&user_stack[PAGE_SIZE>>2],0x10};



void show_task(int num,struct task_struct *p)
{
	int i,j=4096-sizeof(struct task_struct);
	print("%d : pid=%d,state=%d\n",num,p->pid,p->state);
}
/*
 * this is the function show the whole system's process's state. 
 */
void show_state()
{
	int i=0;
	for(i=0;i<NR_TASKS;i++)
		if(task[i])
			show_task(i,&task[i]);
}
void sechedule()
{
	int i,next,c;
	struct task_struct **p;
	p=&task_tail;
	while(p)
	{
		if((*p)->alarm &&(*p)->alarm<jiffies)
		{
			(*p)->signal |= (1<<SIGALRM-1);// XXX 有一些信号量食补可以屏蔽的，此处用来确定是否被屏蔽
			(*p)->alarm=0;
		}
		if(((*p)->signal &~ (_BLOCKSIG &(*p)->blocked))&&
				(*p)->state==TASK_INTERRUPTIBLE)
			(*p)->state=TASK_RUNNING;
		while(1)
		{
			c=-1;
			next=0;
			p=&task_tail;
		}
	}
	switch_to(next);
}
/*
 * 将进程的变量设定为可中断，然后运行sched函数进行重新安排。
 */
int sys_pause(void)
{
	current->state=TASK_INTERRUPTIBLE;
	schedule();
	return 0;
}
/*
 * sleep_on函数的定义到底如何，始终让我觉得迷茫。
 */
void sleep_on(struct task_struct **p)
{
	struct task_struct *tmp;
	if(!p)
		return ;
	if(current==&(task_list[0]))
		wrong("can not stop the init task");
	tmp=*p;
	*p=current;
	current->state=TASK_UNINTERRUPTIBLE;
	sechedule();
}

void interruptible_sleep_on(struct task_struct **p)
{
	struct task_struct *tmp;
	if(!p)
		return;
	if(current==&task_list[0])
		wrong("init task can not stop  ");
	tmp=*p;
	*p=current;
repeat:
	current->state=TASK_INTERRUPTIBLE;
	schedule();

	if(*p&&*p!=current)
	{
		(**p).state=TASK_RUNNING;
		goto repeat;
	}
	*p=tmp;
	if(tmp)
		tmp->state=TASK_RUNNING;
}
void wake_up(struct task_struct **p)
{
	if(p&&*p)
		(**p).state=TASK_RUNNING;

}
/*
 * 下面是无聊的代码
 */
int get_current_pid(void)
{
	return current->pid;
}
int get_current_gid(void)
{
	return current->gid;
}
/*
 * 很多东西在经过很长时间的变化后基本形式还是一样，但是具体的实现就稳重和完善的多。
 */
/*
 * sched_init();
 * 再过去的很多版本中都没有太大的变化，看来很多概念是通用的。需要掌握基础 
 */
struct timer_list
{
	long jiffies;
	void (*fn)();
	struc timer_list *next;
} timer_list[TIME_REQUESTS],*next_timer=NULL;
void init_sechedue()
{
	int i;
	struct task_struct *p;
	set_tss_desc();
	set_system_gate();
}


//设定警报时间值
int sys_alarm(long second)
{
	int old=current->alarm;
	if(old)
		old=(old-jiffies)/HZ;
	current->alarm=(second>0)?(jiffies+HZ*second):0;
	return (old);
}
